package com.zhq.security.auth.utils;


import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * token包含三部分
 * 第一头部：使用具体的什么加密算法(alg)还有一个什么类型参数
 * 第二部分：用户信息，sub：用户名，创建时间等
 * 第三部分签名：
 */
@Component
public class TokenUtil {
    /**
     *
     * @param expireMills   过期时间
     * @param userName      用户名
     * @return
     */
    public String createToken(long expireMills,String userName){
        //设置头部（即设置对应的算法）
        SignatureAlgorithm signatureAlgorithm=SignatureAlgorithm.HS256;

        //设置对应的用户信息
        Map<String,Object> claims=new HashMap<>();
        claims.put("sub",userName);
        String key="1234a";
        //设置第二部分
        JwtBuilder jwt= Jwts.builder()
                .setClaims(claims)
                //设置jwt的唯一标识
                .setId(UUID.randomUUID().toString())
                //设置创建时间
                .setIssuedAt(new Date())
                //设置唯一所有人
                .setSubject(userName)
                .signWith(signatureAlgorithm,key);
        return  jwt.compact();
    }

    /**
     * Token解析
     * @param token 被解析 JWT
     * @param key 用户实体对象 可以通过数据库查询
     * @return 返回payload中存的数据
     */
    public  String  parseJWT(String token, String key){
        //根据用户获取密钥
//        String key = userEntity.getUserPassword();
        //获取DefaultJwtParser

        Claims claims = Jwts.parser()
                //设置 密钥
                .setSigningKey(key)
                //设置需要解析的 token
                .parseClaimsJws(token).getBody();
        return claims.get("sub").toString();
    }

}
